平常我們在實驗室會使用到一些硬體裝置,比如Arduino 或 Feather 的 Adafruit 的開發板,故需要與 Unity 做串接與一同使用,所以這邊我希望跟大家介紹如何將 Arduino 與 Unity 結合一起使用。 今天我使用的開發板是最基本的 Arduino 的 Uno 板,很常見所以也非常好上手。這邊幾個步驟就可以將其與 Unity 串接,透過 Port 來讀取該 Arduino 輸出的結果。也希望這篇幫助到需要將Unity 與 Arduino 一同使用的人有些幫助。
因為需要使用 System.IO.Ports 所以需要先將 .net 版本更新。這邊到 Edit → Porject Settings → Player 中去找到 Api Comptibility Level 。並設定成 .Net 4.x
接下來就可以實際的使用到 Serial Ports 的這些在 System IO 特定的組件。 Serial Ports 就是我們要使用到電腦的Serial Port。之後請接上你的 Arduino 板。然後到裝置管理員查看一下你接的 Port 是哪一個。 我這邊是 COM 7。
新增一個空白物件 GetArduino,並且新增一個腳本 ArduinoPort。
要將我們需要使用到的函示庫引入
using UnityEngine;
using System;
using System.IO.Ports;
using System.Threadings;
string portName_1 = "COM7"; // 將板子插進的USB接口 到裝置管理員查看
int baudRate = 9600; // 顯示的胞率
Parity parity = Parity.None;
int dataBits = 8;
StopBits stopBits = StopBits.One;
SerialPort serialPort = null;
public int isClosedPort = 1;
void Start()
{
OpenPort();
}
public void OpenPort()
{
serialPort_1 = new SerialPort(portName_1, baudRate, parity, dataBits, stopBits);
try{
serialPort_1.Open();
Debug.Log("Open Port Success");
}catch(Exception ex)
{
Debug.Log(ex.Message);
}
}
serialPort_1 = new SerialPort(portName_1, baudRate, parity, dataBits, stopBits);
try{
serialPort_1.Open();
Debug.Log("Open Port Success");
}catch(Exception ex)
{
Debug.Log(ex.Message);
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System;
using System.Threading;
public class ArduinoPort : MonoBehaviour
{
string portName_1 = "COM7";
int setBaudRate = 9600;
Parity parity = Parity.None;
int dataBits = 8;
StopBits stopBits = StopBits.One;
SerialPort serialPort = null;
public int isClosePort = 1;
// open the port
void Start()
{
OpenPort();
}
void OpenPort()
{
serialPort = new SerialPort(portName_1, setBaudRate, parity, dataBits, stopBits);
// check whether port is open
try{
serialPort.Open();
Debug.Log("Open Port Success...");
}catch(Exception e)
{
Debug.Log(e.Message);
}
}
}
public void ClosePort()
{
try{
serialPort_1.Close();
}catch(Exception ex)
{
Debug.Log(ex.Message);
}
}
void ReadData()
{
if(serialPort.IsOpen)
{
string a = serialPort.ReadExisting();
valueText.text = a;
Thread.Sleep(500); // delay 0.5s to read the data
}
}
回到 Unity 去設計一下 UI,將我們的 Text 放進到我們的環境中。
接下來新增兩個 Button 去控制該 Arduino Port 開啟或關閉。不要忘記要設定 function 到 Onclick 事件中。
完整的 Code。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System;
using System.Threading;
using UnityEngine.UI;
public class ArduinoPort : MonoBehaviour
{
string portName_1 = "COM7";
int setBaudRate = 9600;
Parity parity = Parity.None;
int dataBits = 8;
StopBits stopBits = StopBits.One;
SerialPort serialPort = null;
public int isClosePort = 1;
public Text showStatusTxt;
public Text valueText;
// open the port
void Start()
{
OpenPort();
}
void Update()
{
ReadData();
}
public void OpenPort()
{
serialPort = new SerialPort(portName_1, setBaudRate, parity, dataBits, stopBits);
// check whether port is open
try{
serialPort.Open();
showStatusTxt.text = "Open Port Success...";
}catch(Exception e)
{
Debug.Log(e.Message);
}
}
public void ClosePort()
{
try{
serialPort.Close();
showStatusTxt.text = "Close Port Success...";
}catch(Exception ex)
{
Debug.Log(ex.Message);
}
}
public void ReadData()
{
if(serialPort.IsOpen)
{
string a = serialPort.ReadExisting();
valueText.text = a;
Thread.Sleep(100); // delay 0.5s to read the data
}
}
}
Serial.begin(9600);
int p1 = 0;
void loop()
{
Serial.println(p1++);
delay(1000);
if(p1== 100)
{
p1 = 0;
}
}
void setup() {
Serial.begin(9600);
}
int count = 1;
void loop() {
// put your main code here, to run repeatedly:
Serial.println(count++);
delay(1000);
if(count == 100)
{
count = 0;
}
}
最後進行編譯且上傳。
接下來點開 工具 > 序列監控視窗。請先務必檢查一下你們的開發板與序列是否正確,抱歉細節設定我就不細說了。
請務必點開先確認你的 Baud 是否正確,若錯誤你就看不到任何數值。
回到 Unity 後執行就會直接讀取該在 Arduino 輸出的數值。可以看到 Console 會顯示當前從Arduino 取出數值的結果。而因為該變化比較快所以 Get Value 的數值在UI上會閃爍。但從 Console 確切知道有取得該 Arduino 的輸出。
請注意到若要停止執行前務必要將該 Port 關閉,也就是一定要按下 Close Port 的 Button,這樣在改寫Arduino 並且上傳時才不會出錯,造成Port相互的衝突。所以務必要關閉。按下 Close Port Button 後看到 Close Port Success… 代表就是成功關閉。若需要重新開啟接收Arduino Import 的數值就在點選該 Open Port 的 Button 即可。但請注意若要更改Arduino 的腳本並上船的時候請注意Unity自身的 Port 為關閉的狀態避免不必要的衝突。
今天我們成功將該 Arduino 輸出的結果取出,下次我們會結合 MPU6050 來將數值取出掛在物件上並使用! 將會很有趣XDD。